package decorator

import (
	"context"

	"github.com/sirupsen/logrus"
)

// 理论上cmd执行不需要返回结果
// 但是我们这里给予一个结果问题也不大，因为用户创建订单后，用户不知道订单id，只有执行了命令之后才能知道订单id
type CommandHandler[C any, R any] interface {
	Handle(ctx context.Context, cmd C) (R, error)
}

func ApplyCommandDecorators[C, R any](handler CommandHandler[C, R], logger *logrus.Logger, metricClient MetricsClient) CommandHandler[C, R] {
	return commandLoggingDecorator[C, R]{
		logger: logger,
		base: commandMetricsDecorator[C, R]{
			client: metricClient,
			base:   handler,
		},
	}
}
